<?php
abstract class ControllerBase extends Core
{
	abstract public function execute(Context $context);

	/**
	 * Vincula un evento a una variable del contexto. Este
	 * evento será llamado cada vez que la propiedad requerida
	 * cambie de valor.
	 *
	 * Los siguientes valores estarán disponibles en la función
	 * controladora de evento:
	 *
	 * @var $propName Nombre de la propiedad que cambió.
	 * @var $cancel   Si se establece a true, se cancelará el cambio de datos.
	 * @var $caller   Descripción de la función que está intentando cambiar la propiedad.
	 *
	 * @param $context      Objeto que contiene la propiedad a monitorear.
	 * @param $propertyName Nombre de la propiedad a monitorear.
	 * @param $code         Código que se ejecutará cuando se dispare el evento.
	 */
	public function propertyChanged(Context $context, $propertyName, $code)
	{
		$proc = '
			if ( gettype($stack->args[0]) == "object" )
				return;

			$caller = $stack->class . $stack->type . $stack->function . "[". $stack->args[0] . "]";

			$procNew = create_function(\'$propName, $cancel, $caller\', \''. $code .'\');
			$procNew($propName, &$cancel, $caller);

		';
		$context->setPropListener($propertyName, $proc, DynamicObject::SETTER);
	}

	/**
	 * Devuelve el nombre de la clase actual.
	 */
	public function className()
	{
		return( get_class($this) );
	}

	/**
	 * Desencadena el error especificado.
	 */
	public function raiseError($errorName, $message = "" )
	{
		Response::raiseError( $errorName, $message, $this->className() . " Handler" );
	}

	/**
	 * Si una condición es verdadera, desencadena el
	 * error especificado y termina el servicio.
	 *
	 * @param condition Expresión a verificar.
	 * @param errorName Excepción que se desencadenará eventualmente.
	 */
	public function assert($condition, $errorName)
	{
		if ( $condition ) {
			$this->raiseError($errorName);
		}
	}

	/**
	 * Incluye una clase relacionada para uso interno del servicio.
	 * Buscará el archivo en el directorio de clases relacionadas.
	 *
	 * @param classFile Nombre del archivo a incluir.
	 */
	public function import($classFile)
	{
		$filename = ContextConfig::RELATED_DIR . $classFile;

		Nereyda::loadLibrary($filename, true);
	}

	/**
	 * Devuelve un objeto CatalogBase que permitirá
	 * el acceso a la base de datos activa.
	 */
	public function getModel()
	{
		$auth  = Auth::getInstance();

		$model = $auth->getModel();

		return( $model );
	}
}
?>
